package main

import (
	"fmt"
	"unsafe"
)

func main() {
	// i := 10
	// ip := &i
	// // var fp *float64=(*float64)(ip) // cannot convert ip (type * int) to type * float64
	// var fp *float64 = (*float64)(unsafe.Pointer(ip))
	// *fp = *fp * 3
	// fmt.Println(fp)

	// uintptr
	// p:=new(person)
	// pName:=(*string)(unsafe.Pointer(p))
	// *pName="zhangsan"
	// pAge:=(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(p))+unsafe.Offsetof(p.Age)))
	// *pAge=20
	// fmt.Println(*p)

	// unsafe.Sizeof 类型所占用的内存大小
	fmt.Println(unsafe.Sizeof(true))
	fmt.Println(unsafe.Sizeof(int8(0)))
	fmt.Println(unsafe.Sizeof(int16(10)))
	fmt.Println(unsafe.Sizeof(int32(10000000)))
	fmt.Println(unsafe.Sizeof(int64(10000000000000)))
	fmt.Println(unsafe.Sizeof(int(10000000000000000)))
	fmt.Println(unsafe.Sizeof(string("飞雪无情")))
	fmt.Println(unsafe.Sizeof([]string{"飞雪u无情", "张三"}))
}

// 一个 struct 结构体的内存占用大小，等于它包含的字段类型内存占用大小之和
type person struct {
	Name string `json:"name" bson:"b_name"` // 键盘数字1前面的符号
	Age  int    `json:"age" bson:"b_age"`
}

/*
	任何类型的 *T 都可以转换为 unsafe.Pointer；

	unsafe.Pointer 也可以转换为任何类型的 *T；

	unsafe.Pointer 可以转换为 uintptr；

	uintptr 也可以转换为 unsafe.Pointer
*/
